package com.gjt.URI_URL;

import com.google.common.collect.Lists;

import java.io.IOException;
import java.net.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created with Intel IDEA.
 *
 * 代理选择器类 ProxySelector： 每个虚拟机都有一个java.net.ProxySelector,用来确定不同链接的代理服务器；
 *                  默认的ProxySelector只检查各种系统属性和URL的协议，来决定如何连接到不同的主机，可以安装自己的ProxySelector的子类代替
 *                  他的关键方法
 *                      public abstract List<Proxy> select（URI uri）抽象方法:传入的是URI而不是URL 说明需要连接到主机
 *                      public void connectFailed(URI uri ,SocketADDRESS ADDRESS, IOException ex): 这是回调方法，用于警告
 *                              程序这个代理服务器实际上没有建立连接
 * 作用：记住可以连接的URL
 *
 * @Auther: gjt
 * @Date: 2024/3/23 13:23
 */
public class LocalProxySelector extends ProxySelector {

    private List<URI> failed = Lists.newArrayList();

    @Override
    public List<Proxy> select(URI uri) {

        List<Proxy> result = Lists.newArrayList();

        // 不区分大小写 包含在失败存储列表 或者 http模式 不用代理
        if(failed.contains(uri) || !"http".equalsIgnoreCase(uri.getScheme())){
            result.add(Proxy.NO_PROXY);
        }else {
            // 创建代理 通过网络套接字类
            InetSocketAddress address = new InetSocketAddress("proxy.example.com", 8000);
            Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
            result.add(proxy);
        }
        return result;
    }


    // 连接失败
    @Override
    public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
        failed.add(uri);
    }
}
